package com.jiangyg.devtools.entity.code;

import org.apache.commons.lang.StringUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 类描述：Bean 定义
 *
 * @author jiangyg
 * @version 1.0
 * @date 2023年08月18日
 */
public class BeanDefinition implements Serializable {

    /**
     * 用来判断是否重复
     */
    private String md5;

    /**
     * 原名称
     */
    private String original;

    /**
     * 名称，一般用来生成文件名
     */
    private String name;

    /**
     * 表注释
     */
    private String comment;

    /**
     * 引用的列表
     */
    private final List<String> imports = new ArrayList<>();

    /**
     * 属性列表
     */
    private final List<BeanProperty> props = new ArrayList<>();

    public BeanDefinition() {
    }

    public String getMd5() {
        return md5;
    }

    public void setMd5(String md5) {
        this.md5 = md5;
    }

    public String getOriginal() {
        return original;
    }

    public void setOriginal(String original) {
        this.original = original;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public List<String> getImports() {
        return imports;
    }

    public List<BeanProperty> getProps() {
        return props;
    }

    public void addProp(BeanProperty prop) {
        props.add(prop);
    }

    public void addPropAll(List<BeanProperty> propList) {
        props.addAll(propList);
    }

    /**
     * 功能描述：提取字段类型和引用
     */
    public void extractPropTypeAndImport() {
        // 设置转换后的类型
        this.getProps().stream()
                .filter(prop -> StringUtils.isNotBlank(prop.getRawType()))
                .forEach(prop -> {
                    final String rawType = prop.getRawType();
                    // 不包含包路径，说明为原始路径
                    if (!StringUtils.contains(prop.getRawType(), ".")) {
                        prop.setType(rawType);
                        return;
                    }
                    // 提取引用类型
                    final String type = StringUtils.substringAfterLast(rawType, ".");
                    prop.setType(type);
                });

        // 按照包名分组
        this.imports.clear();
        this.getProps().stream()
                .map(BeanProperty::getRawType)
                .filter(rawType -> StringUtils.contains(rawType, "."))
                .distinct()
                .collect(Collectors.groupingBy(rawType -> StringUtils.substringBeforeLast(rawType, ".")))
                .forEach((key, value) -> {
                    if (value.size() == 1) {
                        imports.add(value.get(0));
                        return;
                    }
                    imports.add(key + ".*");
                });
    }

}
